#include "SymboleValue.h"
#include <stdlib.h>

////////////////////////////////////////////////////////////////////////////////

SymboleValue::SymboleValue(Symbole s) :
Symbole(s.getChaine()) {
    if (s == "<ENTIER>") {
        valeur = new ValeurEntiere(atoi(s.getChaine().c_str())); // c_str convertit une string en char*
        defini = true;
    } else if (s == "<REEL>") {
        valeur = new ValeurReelle(strtod(s.getChaine().c_str(), NULL)); // c_str convertit une string en char*
        defini = true;
    } else if (s == "<CHAINE>") {
        valeur = new ValeurChaine(s.getChaine());
        defini = true;
    } else if (s == "<CARACTERE>") {
        valeur = new ValeurCaractere(s.getChaine()[1]);
        defini = true;
    } else {
        defini = false;
    }
}

////////////////////////////////////////////////////////////////////////////////

void SymboleValue::afficher(unsigned short indentation) {
    Noeud::afficher(indentation);
    cout << "Feuille - Symbole value : " << getChaine() << endl; // on affiche la chaine du symbole
}

////////////////////////////////////////////////////////////////////////////////
// Attention : cette fonction (operator) n'est pas membre de la classe SymboleValue

ostream & operator <<(ostream & cout, SymboleValue symb) {
    cout << (Symbole) symb << "\t\t - Valeur=";
    if (symb.defini && symb == "<CHAINE>")
        cout << ((ValeurChaine*) symb.valeur)->getValeur() << " ";
    else if (symb.defini && symb == "<CARACTERE>")
        cout << ((ValeurCaractere*) symb.valeur)->getValeur() << " ";
    else if (symb.defini && symb == "<ENTIER>")
        cout << ((ValeurEntiere*) symb.valeur)->getValeur() << " ";
    else if (symb.defini && symb == "<REELLE>")
        cout << ((ValeurReelle*) symb.valeur)->getValeur() << " ";
    else if (symb.defini && symb == "<VARIABLE>") {
        if (typeid (*symb.valeur) == typeid (ValeurEntiere))
            cout << ((ValeurEntiere*) symb.valeur)->getValeur() << " ";
        else if (typeid (*symb.valeur) == typeid (ValeurReelle))
            cout << ((ValeurReelle*) symb.valeur)->getValeur() << " ";
        else if (typeid (*symb.valeur) == typeid (ValeurChaine))
            cout << ((ValeurChaine*) symb.valeur)->getValeur() << " ";
        else if (typeid (*symb.valeur) == typeid (ValeurCaractere))
            cout << ((ValeurCaractere*) symb.valeur)->getValeur() << " ";
    } else
        cout << "indefinie ";
    return cout;
}
